package com.atguigu.springboot.service.impl;

import com.atguigu.springboot.bean.SysMenu;
import com.atguigu.springboot.mapper.SysMenuMapper;
import com.atguigu.springboot.service.ISysMenuService;
import com.atguigu.springboot.utils.PreUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author admin
 * @create 2021-12-09 15:20
 */
@Service
public class SysMenuServiceImpl implements ISysMenuService {

    @Autowired(required = false)
    private SysMenuMapper sysMenuMapper;

    @Override
    public List<SysMenu> selectMenuAll() {
        List <SysMenu> sysMenus = sysMenuMapper.selectMenuAll();
        //首先取出所有根节点的数据
        List <SysMenu> rootMenus = sysMenus.stream().filter(sysMenu -> (sysMenu.getParentId() == null || sysMenu.getParentId() == 0)).collect(Collectors.toList());
        /**
         * 整体的思路:
         * 1、无论使用什么方式先取出跟节点数据；
         * 2、根据根节点id,和查询出的所有数据，其他数据和上级父id来重新组装这个集合
         * 3、最后拿出的这个数组则是组装后的树形结构
         */
        List<SysMenu> treeMenus = new ArrayList <SysMenu>();
        for (SysMenu menu : rootMenus) {
            menu=getChild(menu,sysMenus);
            treeMenus.add(menu);
        }
        return rootMenus;
    }

    @Override
    public List <SysMenu> getMenuTree() {
        List <SysMenu> sysMenus = sysMenuMapper.selectMenuAll();
        //首先取出所有根节点的数据
        List <SysMenu> rootMenus = sysMenus.stream().filter(sysMenu -> (sysMenu.getParentId() == null || sysMenu.getParentId() == 0)).collect(Collectors.toList());
        /**
         * 整体的思路:
         * 1、无论使用什么方式先取出跟节点数据；
         * 2、根据根节点id,和查询出的所有数据，其他数据和上级父id来重新组装这个集合
         * 3、最后拿出的这个数组则是组装后的树形结构
         */
        PreUtil.getChildMenu(rootMenus,sysMenus);
        return rootMenus;
    }


    /**
     * 递归建立树形菜单
     * @param sysMenus
     * @return
     */
    private SysMenu getChild(SysMenu sysMenu,List <SysMenu> sysMenus){
        List<SysMenu> childList = new ArrayList <SysMenu>();
        for (SysMenu menu : sysMenus) {
            if (menu.getParentId().equals(sysMenu.getMenuId())){
                //如果有子节点就进行递归遍历
                childList.add(getChild(menu,sysMenus));
            }
        }
        //将获取到的子节点放入对象子节点中
        sysMenu.setChildren(childList);
        return sysMenu;
    }
}
